#include "Rationnel.h"

Rationnel::Rationnel(int num=0,int den=1) throw(DataException): NonComplexe(RATIONNAL){
        if(den == 0)
                throw DataException("Division par 0");
        this->num = num;
        this->den = den;
this->type = RATIONNAL;
}

Rationnel::Rationnel(const Entier& c,const Entier& d) throw(DataException): NonComplexe(RATIONNAL){

        if(d.getVal() == 0)
                throw DataException("Division par 0");
this->type = RATIONNAL;

        this->num = static_cast<const Entier&>(c).getVal();
        this->den = d.getVal();
}

Constante* Rationnel::operator+(const Constante& c)const{

        switch(c.getType()){
                case Constante::INTEGER:
        return *this+Rationnel(static_cast<const Entier& >(c));
                break;
                case Constante::RATIONNAL:
        return new Rationnel(this->num*static_cast<const Rationnel&>(c).den+static_cast<const Rationnel&>(c).num*this->den,
                        this->den*static_cast<const Rationnel&>(c).den);
                break;
        }
}

Constante* Rationnel::operator*(const Constante& c)const{
        switch(c.getType()){
                case Constante::INTEGER:
        return *this*Rationnel(static_cast<const Entier& >(c));
                break;
                case Constante::RATIONNAL:
        return new Rationnel(this->num*static_cast<const Rationnel&>(c).den-static_cast<const Rationnel&>(c).num*this->den,
                        this->den*static_cast<const Rationnel&>(c).den);
                break;
        }
}

Constante* Rationnel::operator-(const Constante& c)const{
        switch(c.getType()){
                case Constante::INTEGER:
        return *this-Rationnel(static_cast<const Entier& >(c));
                break;
                case Constante::RATIONNAL:
        return new Rationnel(this->num*static_cast<const Rationnel&>(c).den-static_cast<const Rationnel&>(c).num*this->den,
                        this->den*static_cast<const Rationnel&>(c).den);
                break;
        }
}

Constante* Rationnel::operator/(const Constante& c)const{
        switch(c.getType()){
                case Constante::INTEGER:
        return *this/Rationnel(static_cast<const Entier& >(c));
                break;
                case Constante::RATIONNAL:
        return new Rationnel(this->num*static_cast<const Rationnel&>(c).den,
                        this->den*static_cast<const Rationnel&>(c).num);
                break;
        }
}

Constante* Rationnel::operator-()const{
        return new Rationnel(-this->num,this->den);
}
